package com.ai.service.cms.user.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import com.ai.common.exception.AlikAssert;
import com.ai.common.exception.BusinessException;
import com.ai.common.model.Pagination;
import com.ai.common.utils.CommonUtil;
import com.ai.manager.edu.cms.user.OperatorRoleManager;
import com.ai.manager.edu.cms.user.RoleManager;
import com.ai.manager.edu.cms.user.RoleMenuManager;
import com.ai.model.edu.cms.backoperator.Role;
import com.ai.model.edu.cms.backoperator.dto.RoleDTO;
import com.ai.model.edu.cms.backoperator.vo.MenuCountVO;
import com.ai.model.edu.cms.backoperator.vo.OperatorCountVO;
import com.ai.model.edu.cms.backoperator.vo.RoleVO;
import com.ai.service.cms.user.RoleService;

@Service("roleService")
public class RoleServiceImpl implements RoleService {
    @Resource
    private RoleManager roleManager;
    @Resource
    private OperatorRoleManager operatorRoleManager;
    @Resource
    private RoleMenuManager roleMenuManager;

    /**
     * Description ： 根据DTO查找角色翻页信息
     * 
     * nyj
     * 
     * @param roleDTO
     * @return
     * @since
     *
     */
    public Pagination<RoleVO> selectRolePagByDTO(RoleDTO roleDTO) {
        // 参数校验
        AlikAssert.isNotNull(roleDTO, "参数不能为空");
        Pagination<RoleVO> pag = roleManager.selectRolePagByDTO(roleDTO);
        if (pag != null && !CollectionUtils.isEmpty(pag.getRows())) {
            List<RoleVO> roleVOs = pag.getRows();
            // 获取角色ID集合
            List<Long> roleIds = CommonUtil.getValueList(roleVOs, "id");
            // 根据角色ID统计用户信息
            List<OperatorCountVO> operatorCountVOs = operatorRoleManager.countOperatorByRoleIds(roleIds);
            List<MenuCountVO> menuCountVOs = roleMenuManager.countMenuByRoleIds(roleIds);
            // List转Map
            Map<Long, Integer> operatorCountMap = new HashMap<Long, Integer>();
            Map<Long, Integer> menuCountMap = new HashMap<Long, Integer>();
            if (!CollectionUtils.isEmpty(operatorCountVOs)) {
                operatorCountMap = CommonUtil.listforMap(operatorCountVOs, "roleId", "operatorCount");
            }
            if (!CollectionUtils.isEmpty(menuCountVOs)) {
                menuCountMap = CommonUtil.listforMap(menuCountVOs, "roleId", "menuCount");
            }
            // 用户数量赋值
            for (RoleVO roleVO : roleVOs) {
                // 用户数量
                roleVO.setOperatorCount(operatorCountMap.get(roleVO.getId()) == null ? 0 : operatorCountMap.get(roleVO.getId()));
                // 菜单数量
                roleVO.setMenuCount(menuCountMap.get(roleVO.getId()) == null ? 0 : menuCountMap.get(roleVO.getId()));

            }
        }
        return pag;
    }

    /**
     * Description ： 查找所有角色信息
     * 
     * nyj
     * 
     * @return
     * @since
     *
     */
    public List<RoleVO> selectAllRoleInfo() {
        return roleManager.selectAllRoleInfo();
    }

    /**
     * Description ： 新增角色信息
     * 
     * nyj
     * 
     * @since
     *
     */
    public void addRoleInfo(Role role) {
        // 参数校验
        AlikAssert.isNotNull(role, "参数不能为空");
        AlikAssert.isNotBlank(role.getRoleName(), "角色名称不能为空");
        AlikAssert.isNotNull(role.getCreateBy(), "创建人不能为空");
        AlikAssert.isNotNull(role.getUpdateBy(), "更新人不能为空");
        // 校验长度
        if (role.getRoleName().length() > 30) {
            BusinessException.throwMessage("角色名称不能超过30个字符");
        }
        if (!StringUtils.isBlank(role.getRemark()) && role.getRemark().length() > 200) {
            BusinessException.throwMessage("角色说明不能超过200个字符");
        }
        // 根据角色名称查找角色
        RoleVO roleVO = roleManager.selectRoleByRoleName(role.getRoleName());
        if (roleVO != null) {
            BusinessException.throwMessage("角色名称已经存在");
        }
        roleManager.addRoleInfo(role);
    }

    /**
     * Description ： 根据角色名称查找角色信息
     * 
     * nyj
     * 
     * @param roleName
     * @return
     * @since
     *
     */
    public RoleVO selectRoleByRoleName(String roleName) {
        AlikAssert.isNotBlank(roleName, "角色名称不能为空");
        return roleManager.selectRoleByRoleName(roleName);
    }

    /**
     * Description ：启用角色
     * 
     * nyj
     * 
     * @param roleDTO
     * @return
     * @since
     *
     */
    public int enableRole(RoleDTO roleDTO) {
        // 参数校验
        AlikAssert.isNotNull(roleDTO, "参数不能为空");
        AlikAssert.isNotNull(roleDTO.getId(), "ID不能为空");
        AlikAssert.isNotNull(roleDTO.getUpdateBy(), "操作人不能为空");
        return roleManager.enableRole(roleDTO);
    }

    /**
     * Description ：冻结角色
     * 
     * nyj
     * 
     * @param roleDTO
     * @return
     * @since
     *
     */
    public int unableRole(RoleDTO roleDTO) {
        // 参数校验
        AlikAssert.isNotNull(roleDTO, "参数不能为空");
        AlikAssert.isNotNull(roleDTO.getId(), "ID不能为空");
        AlikAssert.isNotNull(roleDTO.getUpdateBy(), "操作人不能为空");
        return roleManager.unableRole(roleDTO);
    }

    /**
     * Description ： 根据角色ids 查询可用角色信息<br>
     * 
     * yangwb
     * 
     * @param ids
     * @return
     * @since
     * 
     */
    public List<RoleVO> findRoleVOsByIds(List<Long> ids) {
        return roleManager.findRoleVOsByIds(ids);
    }

    /**
     * Description ： 根据ID删除角色
     * 
     * nyj
     * 
     * @param roleDTO
     * @return
     * @since
     *
     */
    public int deleteRoleById(RoleDTO roleDTO) {
        // 参数校验
        AlikAssert.isNotNull(roleDTO, "参数不能为空");
        AlikAssert.isNotNull(roleDTO.getId(), "ID不能为空");
        AlikAssert.isNotNull(roleDTO.getUpdateBy(), "操作人不能为空");
        // 删除角色用户关系
        operatorRoleManager.deleteOperatorRoleByRoleId(roleDTO.getId());
        // 删除角色菜单关系
        roleMenuManager.deleteRoleMenuByRoleId(roleDTO.getId());
        // 删除角色信息
        return roleManager.deleteRoleById(roleDTO);
    }
}
